package upload

import (
	"strconv"
	"x-admin/backend/pkg/response"

	"github.com/gin-gonic/gin"
)

// Handler 文件上传处理器
type Handler struct {
	service Service
}

// NewHandler 创建文件上传处理器
func NewHandler(service Service) *Handler {
	return &Handler{
		service: service,
	}
}

// Upload 上传文件
// @Summary 上传文件
// @Description 上传单个文件
// @Tags 文件管理
// @Accept multipart/form-data
// @Produce json
// @Param file formData file true "上传的文件"
// @Param type formData string false "文件类型"
// @Param category formData string false "文件分类"
// @Param description formData string false "文件描述"
// @Success 200 {object} response.Response{data=UploadResponse} "上传成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /upload [post]
func (h *Handler) Upload(c *gin.Context) {
	// 获取上传的文件
	file, err := c.FormFile("file")
	if err != nil {
		response.BadRequest(c, "请选择要上传的文件")
		return
	}

	// 获取请求参数
	var req UploadRequest
	if err := c.ShouldBind(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	// 获取用户ID
	var userID *uint
	if uid, exists := c.Get("user_id"); exists {
		if id, ok := uid.(uint); ok {
			userID = &id
		}
	}

	// 上传文件
	result, err := h.service.Upload(file, &req, userID)
	if err != nil {
		response.InternalServerError(c, "文件上传失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "文件上传成功", result)
}

// Delete 删除文件
// @Summary 删除文件
// @Description 删除指定文件
// @Tags 文件管理
// @Accept json
// @Produce json
// @Param delete body DeleteRequest true "删除参数"
// @Success 200 {object} response.Response "删除成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "文件不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /upload/delete [post]
func (h *Handler) Delete(c *gin.Context) {
	var req DeleteRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	// 获取用户ID
	var userID *uint
	if uid, exists := c.Get("user_id"); exists {
		if id, ok := uid.(uint); ok {
			userID = &id
		}
	}

	if err := h.service.Delete(&req, userID); err != nil {
		if err.Error() == "文件不存在" {
			response.NotFound(c, err.Error())
			return
		}
		if err.Error() == "无权限删除此文件" {
			response.Forbidden(c, err.Error())
			return
		}
		response.InternalServerError(c, "删除文件失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "文件删除成功", nil)
}

// BatchDelete 批量删除文件
// @Summary 批量删除文件
// @Description 批量删除多个文件
// @Tags 文件管理
// @Accept json
// @Produce json
// @Param delete body BatchDeleteRequest true "批量删除参数"
// @Success 200 {object} response.Response "删除成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /upload/batch-delete [post]
func (h *Handler) BatchDelete(c *gin.Context) {
	var req BatchDeleteRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	// 获取用户ID
	var userID *uint
	if uid, exists := c.Get("user_id"); exists {
		if id, ok := uid.(uint); ok {
			userID = &id
		}
	}

	if err := h.service.BatchDelete(&req, userID); err != nil {
		response.InternalServerError(c, "批量删除文件失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "批量删除成功", nil)
}

// GetByID 根据ID获取文件信息
// @Summary 获取文件信息
// @Description 根据ID获取文件详细信息
// @Tags 文件管理
// @Accept json
// @Produce json
// @Param id path int true "文件ID"
// @Success 200 {object} response.Response{data=FileInfo} "获取成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "文件不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /upload/files/{id} [get]
func (h *Handler) GetByID(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的文件ID")
		return
	}

	file, err := h.service.GetByID(uint(id))
	if err != nil {
		if err.Error() == "文件不存在" {
			response.NotFound(c, err.Error())
			return
		}
		response.InternalServerError(c, "获取文件信息失败: "+err.Error())
		return
	}

	response.Success(c, file)
}

// List 获取文件列表
// @Summary 获取文件列表
// @Description 分页获取文件列表
// @Tags 文件管理
// @Accept json
// @Produce json
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页数量" default(10)
// @Param keyword query string false "关键词搜索"
// @Param file_type query string false "文件类型"
// @Param extension query string false "文件扩展名"
// @Param storage_type query string false "存储类型"
// @Param user_id query int false "用户ID"
// @Param status query int false "状态"
// @Success 200 {object} response.PageResponse{data=[]FileInfo} "获取成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /upload/files [get]
func (h *Handler) List(c *gin.Context) {
	var req QueryRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	files, total, err := h.service.List(&req)
	if err != nil {
		response.InternalServerError(c, "获取文件列表失败: "+err.Error())
		return
	}

	response.Page(c, files, total, req.Page, req.PageSize)
}

// GetConfig 获取上传配置
// @Summary 获取上传配置
// @Description 获取文件上传的配置信息
// @Tags 文件管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=UploadConfig} "获取成功"
// @Security BearerAuth
// @Router /upload/config [get]
func (h *Handler) GetConfig(c *gin.Context) {
	config := h.service.GetUploadConfig()
	response.Success(c, config)
}
